正确传递参数给setTimeout
我正在研究一个Node.js项目,并且我正在用一个setTimeout
函数来封装一个Promise
函数。
我原来的Promise
function:
我想在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()
可用?
你正在接近这个里面。 当你想把非承诺的asynchronous代码(比如setTimeout
)合并到基于承诺的代码中时,你应该隔离包装的非承诺部分,而不是在承诺代码的其余部分混合得太深。
承诺包装setTimeout
:
function delay(ms) { return new Promise(function (resolve) { setTimeout(resolve, ms); }); }
那么你可以使用它:
return Promise.props(data) .then(function (result) { return delay(1000).return(result); });
既然你似乎在使用蓝鸟,你也可以跳过所有的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); }); });
编辑:如果你使用蓝鸟,它看起来像他们有延迟操作内置: