在递归异步函数中承诺 [英] Promises in recursive asynchronous functions

查看:147
本文介绍了在递归异步函数中承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个铬合金书签并找到它的父母,一直到父书签文件夹。



下面的函数用于获取给定书签的第一个父项。

 <$ c $ b $ function getParent(bookmark){
var promise = new Promise(function(resolve,reject){
chrome.bookmarks.get(bookmark.parentId,function(nodes){
resolve (节点[0]);
});
});
返回承诺;
}

我无法获得所有书签父母。下面的功能不起作用,但它应该显示我在找什么。

 函数getParents(书签,父母){
var parents = parents || [];
var promise;
$ b $ getParent(书签).then(函数(父){
if(parent.parentId =='0'){
parents.push(parent);
promise = Promise.resolve(parents);
} else {
parents.push(parent);
getParents(parent,parents);
}
}) ;
返回承诺;
}

我想我真正的问题是:你如何得到承诺在递归中工作异步功能?

或者如果您有更好的方式来做到这一点,那也可以。 .then 回调或其他承诺的最终值:

 函数getParents(书签,父母){
var父母=父母|| [];

return getParent(bookmark).then(function(parent){
parents.push(parent);
return parent.parentId =='0'?parents:getParents(父母,父母);
});
}

请参阅 http://www.html5rocks.com/en/tutorials/es6/promises/#toc-chaining


I want to take a chrome bookmark and find its parents, all the way up to the parent bookmark folder.

The function below works for getting the first parent of the given bookmark.

function getParent(bookmark) {
  var promise = new Promise(function(resolve, reject) {
    chrome.bookmarks.get(bookmark.parentId, function(nodes) {
      resolve(nodes[0]);
    });
  });
  return promise;
}

I'm having trouble getting all of the bookmarks parents. The function below doesn't work but it should show what I'm looking for.

function getParents(bookmark, parents) {
  var parents = parents || [];
  var promise;

  getParent(bookmark).then(function(parent) {
    if (parent.parentId == '0') {
      parents.push(parent);
      promise = Promise.resolve(parents);
    } else {
      parents.push(parent);
      getParents(parent, parents);
    }
  });
  return promise;
}

I guess my real question is: how do you get promises to work in recursive asynchronous functions?

Or if you have a better way of doing this, that works too.

解决方案

Simply return the promise returned by .then and either return the final value from the .then callback, or another promise:

function getParents(bookmark, parents) {
  var parents = parents || [];

  return getParent(bookmark).then(function(parent) {
    parents.push(parent);
    return parent.parentId == '0' ? parents : getParents(parent, parents);
  });
}

See http://www.html5rocks.com/en/tutorials/es6/promises/#toc-chaining

这篇关于在递归异步函数中承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆