如何同时多次调用任何返回promise

时间:2017-01-25 11:51:19

标签: javascript promise synchronous

例如,我有Promise.resolve()的函数,如果我已经有任何缓存的实体id,那么它会调用ajax来保留实体id,然后是Promise.resolve()新的实体id

function getReservedEntityId(collectionName) {
        //if (!haveCachedIds) {
            //make ajax call to reserve new ids
            Promise.resolve(newId);
        }
        return Promise.resolve(cachedId);
};

我们如何多次同步调用它以保留多个实体ID?

PS 我知道正确的方法是使这个函数获取参数,该参数将指定实体ID的数量并相应地发出请求和返回ID但我想了解如何同步调用多个任何返回承诺的函数。

2 个答案:

答案 0 :(得分:2)

首先,getReservedEntityId()的实施需要正确使用承诺。我建议您仔细阅读how promises work。特别是,了解当您的函数执行异步任务时,您需要根据异步任务的结果返回要求解析或拒绝的承诺。

function getReservedEntityId(collectionName) {
  if (haveCachedIds) {
    return Promise.resolve(cachedId);
  } else {
    return new Promise((resolve, reject) => {
      // Make the AJAX call and call resolve(newId) in the success callback
      // or call reject(errCode) in the failure callback.
      // The arguments newId and errCode can be any values you like and are
      // the values that get passed to the next link in the promise chain
      //   i.e. the values passed to then() or catch()
    });
  }
}

有了这个平方,有两种推荐的方法可以使调用同步:

1)利用承诺链

getReservedEntityId(collectionName)
  .then((id) => {
    // Probably want to do something with `id` first...

    return getReservedEntityId(collectionName);
  })
  .then( ... )
  .then( ... );

当然,如果您要将相同的函数传递给每个.then()调用,您也可以将其声明为常规函数,以免重复。

2)使用async/await

这是一项新的ES2017功能,但仍未得到广泛支持。截至撰写本文时,Node.js支持使用--harmony标志的async / await,但most browsers do not。也就是说,async / await旨在用于此目的,将函数作为同步函数处理返回promises。如果你现在想在你的代码中开始使用async / await,通常的做法就是使用JavaScript转换器,它将你未来准备好的JavaScript转换为所有主流浏览器都支持的代码。

这就是你如何使用async / await:

(async function someAsyncFunction {
  const id1 = await getReservedEntityId(collectionName);
  const id2 = await getReservedEntityId(collectionName);
  const id3 = await getReservedEntityId(collectionName);
                          .
                          .
                          .
})();

语法比promise链更好,更易读,因为它是为了这个目的而设计的。请注意,我已在此处自行调用该函数,以便它与您的行为匹配,而无需进行额外的函数调用。但是你可以使用和调用用async function定义的函数,就像任何其他返回promise的函数一样。

答案 1 :(得分:0)

@fvgs你的回答也是正确的。但这里是完整的解决方案,我面临的挑战是维护每个getReservedEntityId调用响应的reserveIds列表。

urlpatterns = [
  .......
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)