我正在尝试在promise链中使用回调函数。实际上原始代码分为两个文件并包含更多代码,但为了使问题清楚,我将其简化为一个简单的文件。
我期待以下代码生成:A B C D E F,但我得到:A D B E C F.我无法理解为什么在B之前调用D,以及如何使代码按预期工作!
当我没有调用任何基于回调的函数并只使用Q.async函数时,它正在按预期工作!
以下是代码:
var Q = require('q');
var FlakeId = require('flake-idgen');
var biguint = require('biguint-format');
var flakeIdGen = new FlakeId({ id: 0, epoch: 1234567891234 });
var idDec = null;
var deferred = Q.defer();
var createId = function() {
console.log('A');
flakeIdGen.next(function (err, id) {
console.log('B');
if (err) {
console.log('Error 1');
deferred.reject(new Error(err));
} else {
idDec = biguint(id, 'dec');
deferred.resolve(idDec);
}
});
return deferred.promise;
};
var doSomething = Q.async(function* () {
console.log('D');
});
createId().then(function(idDec) {
console.log('C');
}).fail(function(err) {
console.log('Error 2');
}).then(
doSomething().then(function() {
console.log('E');
}).fail(function(err) {
console.log('Error 3');
}).then(function() {
console.log('F');
}
));
任何帮助表示赞赏。感谢。
答案 0 :(得分:2)
问题是你如何调用doSomething
此代码应按您需要的顺序工作
createId()
.then(function(idDec) {
console.log('C');
})
.fail(function(err) {
console.log('Error 2');
})
.then(function() { // edited as per comments
return doSomething(p1, p2);
})
.then(function() {
console.log('E');
}).fail(function(err) {
console.log('Error 3');
}).then(function() {
console.log('F');
});
使用像doSomething()
之类的doSomething会立即执行它,而.then(
会忽略它,因为它不是函数... doSomething
参数是函数... doSomething()
作为参数是函数的结果
由于我不完全熟悉doSomething
函数内容的语义,以上可能实际上不起作用,我无法测试该特定代码
我假设doSomething返回值或Promise