首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环,直到promise函数给出结果

循环,直到promise函数给出结果
EN

Stack Overflow用户
提问于 2017-08-28 09:34:08
回答 2查看 517关注 0票数 0

我希望在promise函数上循环,直到得到我想要的结果。

到目前为止,我使用的递归性如下:

代码语言:javascript
运行
AI代码解释
复制
function pull() {
   dataFactory.pullFunction().then(function(res) {
      pull()       
   })
}

例如,这会给我的加载栏带来一些前端/风格的bug。

我会这样做:

代码语言:javascript
运行
AI代码解释
复制
function pull() {
    while (res.status == 'ONGOING') {
        dataFactory.pullFunction().then(function(res) {
            // my stuffs
        })
    }
 }

但是当我尝试它时,pullFunction()从未被调用过。

EN

回答 2

Stack Overflow用户

发布于 2017-08-28 10:44:35

如果您不能使用async/await,那么您必须使用一个调用自身的函数。这并不是真正的递归,因为调用堆栈并不像通常的(同步)递归那样堆积起来。

但是,你需要一直坚持承诺。因此,在代码的其余部分中,在初始调用pull时,也要遵守承诺,并继续使用then

可能您还希望将从提取中获得的数据块收集到一个数据集中。

在这里,我将假设响应对象将具有一个包含数据块的数据属性。

这是如何工作的(使用pullFunction的虚拟实现):

代码语言:javascript
运行
AI代码解释
复制
function pull() {
    return (function loop(data) {
        return dataFactory.pullFunction().then ( res => {
            return res.status === 'ONGOING'
                ? loop(data.concat(res.data))
                : data.concat(res.data)
        });
    })([]);
}

// Mock implementation
var dataFactory = {
    pullFunction: function () {
        console.log('pull');
        return new Promise( resolve => {
            setTimeout(_ =>
                resolve({
                    status: Math.random() > 0.7 ? 'DONE' : 'ONGOING',
                    data: [1,2,3,4]
                }),
            500)
        });
    }
}

// test it
pull().then( (data) => {
    console.log('data: ', data);
});
代码语言:javascript
运行
AI代码解释
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2017-08-28 09:39:16

只需创建一个isOngoing变量

代码语言:javascript
运行
AI代码解释
复制
let isOngoing = false;
function pull() {
  isOngoing = true;
  dataFactory.pullFunction()
    .then(res => {
      if(<your-condition>) {
        isOngoing = false;
      } else {
        pull();
      }
    })
}

编辑

您在这里处理的是异步操作,不能用传统的whilefor循环来循环它。除非您的环境允许您使用async/await功能。

代码语言:javascript
运行
AI代码解释
复制
async function pull() {
    while (res.status == 'ONGOING')
        await dataFactory.pullFunction().then(function(res) {
            // my stuffs
        })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45915905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档