gpt4 book ai didi

javascript - 打破 Promise 链

转载 作者:行者123 更新时间:2023-11-29 21:01:20 25 4
gpt4 key购买 nike

我正在创建一个函数,该函数返回一个 Promise,用于 Promise.all(myArray.map(saidFunction)) with 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,而无需继续执行 next then 函数。

最佳答案

在您的情况下,一些 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 值和结果异步调用。

关于javascript - 打破 Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46353842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com