您的位置:首页 > Web前端 > Node.js

node.js使用async完成同步调用

2017-11-06 20:13 429 查看
node.js让初学者最头疼之处,莫过于彻头彻尾的异步机制。所有代码,在排版上的先后顺序并不决定了其调用顺序。然而人的思维恰恰是按照同步顺序流转的,于是令人叫苦不迭的情况应运而生——你理所当然的编写了一段看似顺序执行的代码,激动一run,哎哟我滴妈——null、颠倒的值、莫名的值不约而同的结伴而至。历经数次磨难,我对node的异步机制有了一定认识,能规避新手坑了。当然,想全面避坑光理解异步还不够,因为有时你必须使用同步执行,两个方法必须有先后顺序才能达到特定功效。async包为我们提供了node下的同步执行方法。

首先,在需要使用同步调用的文件引入async(之前要先npm install async,在此不赘述):

var async = require('async');

之后,将要顺序执行的方法放入async的series方法中:
async.series([function(cb){//your code here},function(cb){//your code here}],function(){//your code to be run at last});

格式为async.series(arrays,done);,arrays是要执行的代码数组,每段代码要被function(cb){}包裹,done是最后无论如何都会执行的代码,相当于java中finally的作用。
最后有一个重点说明:cb相当于一个执行标志,每一个代码段都由cb控制,cb在哪就代表在这之前的代码都必须被顺序执行到才能进入下一个代码段,这对于控制带有回调函数的代码的顺序执行至关重要。下面举个我自己项目的例子:

/*
添加一个用户
*/
exports.addAUser = function (values, callback) {
let user = null;

async.series([function (cb) {
//顺序执行的代码一
sqliteHelper.findNoteById(tableName, keyName, values[0],
function (error, result) {
if (error) throw error;
user = result;
},
function (error) {
if (error) throw cb(error, null);
//回调函数中也要传入cb,否则如果cb放在回调函数之外则无法完成同步
cb(null);
});
}, function (cb) {
//顺序执行的代码二
//0代表error,1代表成功添加用户,2代表用户已存在无法添加
if (user === null) {
sqliteHelper.add("users", colNames, values,
function (error) {
if (error) {
util.log('Fail on add a user:' + values[0] + 'because of error:' + error);
callback(error, 0);
}
else {
callback(null, 1);
// console.log("exist");
}
//回调函数中也要传入cb,否则如果cb放在回调函数之外则无法完成同步
cb(error);
});
}
else {

4000
callback(null, 2);
cb();
}

}], function (error, values) {
if (error) throw error;
});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息