正确传递参数给setTimeout

我正在研究一个Node.js项目,并且我正在用一个setTimeout函数来封装一个Promise函数。

我原来的Promisefunction:

我想在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); }); }); 

编辑:如果你使用蓝鸟,它看起来像他们有延迟操作内置: