簡體   English   中英

正確地將參數傳遞給setTimeout

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM