javascript - 正确传递参数给setTimeout

标签 javascript node.js promise settimeout

我正在开发一个 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/

相关文章:

javascript - Highcharts 列工具提示 - 始终位于顶部 + 适合容器

php - 网站的多语言(php 和 javascript)

node.js - 无法在 TypeScript 中导入 Google Storage

node.js - 无法在 Windows 上使用 npm 安装 node.js 包 'scrypt'

unit-testing - Jasmine 中没有解决的 Angular promise

javascript - 如何检查一个数组是否包含另一个数组?

javascript - 在 Angular DOM 操作后执行 Javascript

node.js - 从同一文件夹中包含无服务器 yml 中的排除包

javascript - 按顺序排列的多个 jQuery promise

Javascript Try Catch 与 Catch 链