同步函數(shù)變異步
1 問題:
1.1 碰到需要調(diào)用你剛正在創(chuàng)建的對像。
function createServer(data, cb) {
data.num = 1;
cb();
return data;
}
const test = {};
let data = createServer(test, function() {
console.log(data.num);// 調(diào)用你創(chuàng)建的對像
});
這時會報錯Cannot read property 'num' of undefined
。
因為回調(diào)函數(shù)調(diào)用時data對象還沒有賦值,所以會報錯。
1.2 自己寫函數(shù)時,需要一個回調(diào)函數(shù),你希望是異步,但是實際是同步。
function foo(s,cb){
console.log(s);
cb();
}
foo("run1",function() {
console.log("callback");// 你希望這里的函數(shù)異步,在run后面輸出,實際上這里在還是同步,沒有達到效果。
})
console.log("run2");
2 解決方案
在nodejs中創(chuàng)一個異步的函數(shù)的調(diào)用方法有三種: setTimeout
,setImmediate
,process.nextTick
第一個問題解決方案:
function createServer(data, cb) {
data.num = 1;
process.nextTick(cb);
// or setImmediate(cb);
// or setTimeout(()=> cb(),0);
return data;
}
const test = {};
let data = createServer(test, function() {
console.log(data.num);// 調(diào)用你創(chuàng)建的對像
});
第二個問題解決方案:
function foo(s,cb){
console.log(s);
process.nextTick(cb);
// or setImmediate(cb);
// or setTimeout(()=> cb(),0);
}
foo("run1",function() {
console.log("callback");// 你希望這里的函數(shù)異步,在run后面輸出,實際上這里在還是同步,沒有達到效果。
})
console.log("run2");
3 總結(jié)
在nodejs中,就三個方法可以使調(diào)用變成異步: setTimeout
,setImmediate
,process.nextTick
,你直接使用process.nextTick
就沒有問題。