Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点js中的承诺内循环时停止_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 在节点js中的承诺内循环时停止

Javascript 在节点js中的承诺内循环时停止,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我正在处理一个问题,在这个问题中,我必须为用户生成一个唯一的id,但我无法找出如何打破承诺中的while循环。以下函数将查找具有相同引用id的用户是否存在,然后返回一个解析承诺 function makeRefId() { return new Promise(function(resolve , reject){ var refId = null; var flag = true; var tempUser ; do{ refId = ran

我正在处理一个问题,在这个问题中,我必须为用户生成一个唯一的id,但我无法找出如何打破承诺中的while循环。以下函数将查找具有相同引用id的用户是否存在,然后返回一个解析承诺

function makeRefId() {

return new Promise(function(resolve , reject){
    var refId = null;
    var flag = true;
    var tempUser ;

    do{
        refId = randomId(); //this will return a random string
        console.log(refId);

        tempUser =   User.findOneAsync({ref_id:refId}).then(function(user){
            if(user == null)
            {
                flag = false;
                resolve(refId);
            }
        });

    }while(flag);

});
}

对于这个,我会使用递归函数。而循环不能很好地与承诺相结合,因为它们是异步的

function makeRefId() {
    const refId = randomId();
    return User.findOneAsync({ ref_id: refId }).then((user) => {
        if (!user) {
            return refId;
        } else {
            return makeRefId();
        }
    });
}
然后您可以这样使用它:

makeRefId().then(refId => {
    // Do whatever with refId
});