[英]Correctly passing parameters to setTimeout
我正在研究Node.js項目,我遇到了使用setTimeout
函數包裝Promise
函數的問題。
我原來的Promise
功能:
我想在調用setTimeout()
時包裝此函數,但是在傳遞Promise
對象時遇到了麻煩。 我需要在setTimeout()
函數中可用的Promise
對象和數據對象,但是當我將它們作為參數傳遞給setTimeout()
,我仍然會收到以下錯誤:
TypeError:無法讀取未定義的屬性'then'
我的代碼:
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()
可用?
你是從里到外接近這個。 當您想要將非承諾異步代碼(例如setTimeout
)合並到基於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
所有承諾所需的時間上再增加 1秒的延遲。 如果您的目標只是讓最短總時間為1秒,那么您可以使用我的方法來解決這個問題 :
return Promise.delay(1000).return(Promise.props(data));
我會忘記使用setTimeout的參數/返回值,並且只使用new Promise
在調用Promise.props之前延遲:
return new Promise(function (resolve) {
window.setTimeout(function () {
resolve(Promise.props(data));
}, 1000);
});
或者,延遲Promise.props的結果:
return Promise.props(data).then(function (data) {
return new Promise(function (resolve) {
window.setTimeout(function () {
resolve(data);
}, 1000);
});
});
編輯:如果您正在使用Bluebird,它看起來像內置了延遲運算符:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.