当前位置: 首页 > 知识库问答 >
问题:

Javascript while循环,其中条件是promise

仇正豪
2023-03-14

在条件是promise的情况下,是否可以在循环时生成本机JavaScript

编辑:我试图做的是在将文件上载到firebase存储之前进行检查,以查看firebase存储中是否已经存在同名文件。如果已有同名文件,则添加随机后缀并再次检查。

var storageRef = firebase.storage().ref().child(fileName);

while(storageRef.getDownloadURL()) {
    // create random number in between 0 and 100
    var random = Math.floor((Math.random() * 100) + 1);    
    storageRef = firebase.storage().ref().child(fileName + random);
}

storageRef.put(file);

共有2个答案

靳举
2023-03-14

是的!

你要找的是发电机:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators.

对于更复杂的东西,我更喜欢使用Observable,例如RxJS。

孔建柏
2023-03-14
匿名用户

是否有可能在条件为promise的情况下使本地JavaScript同时循环?

不,不是。

尝试这样做有几个问题:

>

  • 使用ES6标准promise,无法直接测试promise的值。对最终解析的值的唯一访问权限是. so()。当(p!==已解决)。

    即使您可以循环Promission值,因为Javascript是事件驱动的单线程,如果您确实执行了循环,那么promise的异步操作将永远无法运行,promise也永远无法得到解决。

    相反,您只需使用:

    p.then(function(result) {
        // process result here
    }).catch(function(err) {
        // process error here
    });
    

    如果您想在循环中做更多的事情,在我们进一步建议如何最好地做到这一点之前,您必须披露实际的代码。

    如果你想重复一些操作,直到某个条件,然后把这个操作放在一个函数中,在.然后()处理程序中测试这个条件,如果你想重复,然后再次调用这个函数。

    function doSomething() {
        // some async operation that returns a promise
    }
    
    function next() {
        return doSomething.then(function(result) {
            if (result < someValue) {
                 // run the operation again
                 return next();
            } else {
                 return result;
            }
        });
    }
    
    next().then(function(result) {
          // process final result here
    }).catch(function(err) {
        // process error here
    });
    

    编辑:使用ES7,您可以使用asyncwait。它不会真的是一个循环,但它将消除对而循环的需求,因为您根本不必“轮询”异步值。

    async function f() {
       let value = await somePromise;
       // put code here to execute after the promise
       console.log(value);
    }
    

    函数f()的内部执行将暂停,直到promise解决或拒绝为止。请注意,f()的调用者将不会暂停f()将在执行wait行后立即返回promise。当f()的内部执行最终完成时,该promise本身将解决并拒绝。

  •  类似资料:
    • 3.2.1 无循环变量的DO构造 a) 一般形式 这种DO构造形式非常简单,一般形式为: [构造名:] DO 块 END DO 不带循环控制变量的DO构造控制机制为:进入DO构造体后,从DO语句下面第一句执行起顺次执行到END DO前的最后一句,再返上来从DO语句下面第一句执行起,重复执行整个DO块。如此反复执行DO块,其间如遇到EXIT语句,就停止执行DO块,退出循环,转向执行END DO下面的

    • 编辑:重新措辞 我有一个账户列表:帐户 当我总结这份清单时,我得到了账户数量和账户总价值的概述 名称摘要 我添加了马克,因为他现在将是一个帐户所有者,但他目前没有任何帐户。 第一步是查看每个人应该拥有的账户的平均数。有25个账户,5个所有者,所以每个人都应该有5个账户。总价值为15600英镑,共有5名所有者,因此每个人的账户价值应该在3120英镑左右。这是一个估计值,所以我对它稍微偏离一点没意见。

    • 控制切换一个元素是否显示也相当简单: <div id="app-3"> <p v-if="seen">现在你看到我了</p> </div> var app3 = new Vue({ el: '#app-3', data: { seen: true } }) 现在你看到我了 继续在控制台输入app3.seen = false,你会发现之前显示的消息消失了。 这个例子演示

    • 读者学到这里估计都有点不耐烦了。好吧,这些数据结构什么的看起来都挺好,但还是没法用它们做什么事,对吧? 下面开始,进度会慢慢加快。前面已经介绍过了几种基本语句(print语句、import语句、赋值语句)。在深入介绍条件语句和循环语句之前,我们先来看看这几种基本语句更多的使用方法。随后你会看到列表推倒式(list comprehension)如何扮演循环和条件语句的角色——尽管它本身是表达式。最后

    • 问题内容: 我试图通过一次添加一天来遍历while循环,但它甚至第一次都不会访问while循环。while循环中的条件正确吗?当我测试它时,它仅在一种情况下起作用,但在我添加第二种条件时停止了。 问题答案: 它应该是

    • 本章的主题是if语句,就是条件判断,会对应程序的不同状态来执行不同的代码。但首先我要介绍两种新的运算符:floor(地板除法,舍弃小数位)和modulus(求模,取余数) 5.1 地板除和求模 floor除法,中文有一种翻译是地板除法,挺难听,不过凑活了,运算符是两个右斜杠://,与传统除法不同,地板除法会把运算结果的小数位舍弃,返回整值。例如,加入一部电影的时间长度是105分钟。你可能想要知道这