我正在开发一个 Node.js 项目,我在使用 setTimeout
函数包装 Promise
函数时遇到问题。
我原来的 Promise
函数:
我想将此函数包装在对 setTimeout()
的调用中,但在传递 Promise
对象时遇到问题。我需要 Promise
对象和 setTimeout()
函数中可用的数据对象,但是当我将它们作为参数传递给 setTimeout()
时,我仍然出现以下错误:
TypeError: Cannot read property 'then' of undefined
我的代码:
return Promise.props(data).then(function (data) {
data.companies = data.order && data.order.companies;
if (!data.companies) {
data.companies = {};
data.companies[data.company.id] = data.company;
}
if (data.order) {
if (data.order.contactentry) {
data.order.pointofcontact = data.order.contactentry + ' ' + phone(data.order.contactentryphone);
} else if (data.order.borrowername) {
data.order.pointofcontact = data.order.borrowername + ' ' + phone(data.order.borrowerphone);
} else if (data.order.lockboxcode) {
data.order.pointofcontact = 'Lockbox ' + data.order.lockboxcode
}
}
if (data.part && data.order && data.part.vendor) {
var oid = data.order && data.order.id;
var vid = data.part && data.part.vendor && data.part.vendor.id;
if (!oid || !vid) {
var e = new Error('Could not assemble vendor accept url, order id or part vendor id are missing')
log.error({
error: e,
data,
}, e.message);
throw e;
}
}
return data;
});
当作为参数传入时,数据对象在函数内部可用,但 Promise
对象不可用。
如何正确传递 Promise
对象以使其在 setTimeout()
中可用?
最佳答案
您正在彻底解决这个问题。当您想将非 promise 异步代码(例如 setTimeout
)合并到基于 promise 的代码中时,您应该隔离包装的非 promise 部分,而不是将其与其余部分混得太深 promise 代码。
setTimeout
的 Promise 包装器:
function delay(ms) {
return new Promise(function (resolve) {
setTimeout(resolve, ms);
});
}
然后就可以使用了:
return Promise.props(data)
.then(function (result) {
return delay(1000).return(result);
});
由于您似乎在使用 Bluebird,您还可以跳过所有 setTimeout
内容并使用内置的 .delay
方法:
return Promise.props(data).delay(1000);
请注意,以上任何一项都会在解决 data
中的所有 promises 时增加 额外 1 秒的延迟。如果您的目标只是让它的最小总时间为 1 秒,那么您可以使用我在 this question 中的方法。 :
return Promise.delay(1000).return(Promise.props(data));
关于javascript - 正确传递参数给setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47297626/