我正在创建一个函数,该函数返回一个Promise,以便在Promise.all(myArray.map(saidFunction))
中使用Bluebird。在这个函数中,我将检查数据库中是否存在记录,如果存在则返回,否则继续执行其他操作。
function saidFunction((objectInfo)) {
return new Promise((resolve, reject) => {
app.models.MyObjectType.exists(objectInfo['id'])
.then((exists) => {
if (exists) return resolve('Object already exists');
})
.then(() => {
console.log('If object does not exist, print this and do some other stuff');
})
.then(() => {
return resolve('Successfully completed');
})
.catch((error) => return reject(error));
});
}
我的问题是,即使对象存在,也会打印If object does not exist, print this
。因此,我正在寻找一种解决方案来返回Promise,而不会继续使用下一个函数。
答案 0 :(得分:2)
在您的情况下,一些then
回调仅包含同步代码,您应该加入它们并在一次回调中验证exists
。
另外,避免promise构造函数反模式,app.models.MyObjectType.exists
已经返回一个promise,所以你不应该创建一个新的。
function saidFunction((objectInfo)) {
return app.models.MyObjectType
.exists(objectInfo['id'])
.then(exists => {
if (exists) {
console.log('Object already exists');
return true;
}
console.log('If object does not exist, print this and do some other stuff');
return false;
})
.catch(err => console.log(err));
});
}
<强>更新强>
如果您需要执行异步任务,使用先前异步调用的结果,您可以使用Promise.all
:
function saidFunction((objectInfo)) {
return app.models.MyObjectType
.exists(objectInfo['id'])
.then(objExists => {
if (objExists) {
return [true, true];
}
return Promise.all([false, ensureFolderExistsAsync()]);
})
.then(([objExists, folderExists]) => {
if (!objExists && folderExists) {
return saveIconAsync();
}
return null;
})
.catch(err => console.log(err));
});
}
在上面的例子中,当对象存在时,我返回一个数组[true, true]
(并且文件夹也存在)。如果该对象不存在,我检查该文件夹是否存在,调用ensureFolderExistsAsync
并使用Promise.all
传递objectExists
值和异步调用的结果。
答案 1 :(得分:0)
这是一种在throw
运营商的帮助下中断并立即解决承诺链的方法。
function saidFunction((objectInfo)) {
return new Promise((resolve, reject) => {
app.models.MyObjectType.exists(objectInfo['id'])
.then(exists => {
if (exists) {
throw ALREADY_EXISTS; // some constant
}
})
.then(() =>
console.log('If object does not exist, print this and do some other stuff')
)
.then(() =>
resolve('Successfully completed')
)
.catch(error => {
if(error === ALREADY_EXISTS) {
resolve('Object already exists');
} else {
reject(error);
}
});
});
}