如何在条件逻辑中使用JavaScript Promise并在返回之前存储到局部变量中?

时间:2018-02-02 01:39:49

标签: javascript promise

我想从函数中获取比return new Promise(...);更多的逻辑。我不确定将Promise存储到变量中是否正在改变它背后的“同步性”,因为我看到的每个例子都没有这样做。我还希望将一个Promise存储到一个变量中,最后返回,即使我没有涉及条件,因为它对于调试来说似乎很糟糕,并且通常将所有逻辑都驻留在return语句中。 / p>

function doSomething(){
    var promise_var1;

    if (condition){
        //Do something async, like an AJAX call to an API
        setTimeout(function(){promise_var1 = Promise.resolve('a')}, 3000);
    }else{
        //Do something synchronous, like setting a default value
        promise_var1 = Promise.resolve('b');
    }    

    return promise_var1;
}

doSomething().then(function(value){console.log('c'+value)});

我现在正在

  

doSomething()未定义

然而,我尝试了各种各样的方式,所以我可能在概念上误解了一些东西。

编辑:“重复”问题是询问如何处理promise中的条件。我问如何通过变量返回promises(实现single exit)。这可能是不可能的,因为JavaScript是弱类型的,Promise变量返回与Promise返回可能表现不同,但如果有一个解决方案,我宁愿单退出多个返回。

3 个答案:

答案 0 :(得分:1)

尝试写下这样的承诺。

my $compare_x = $user_input_x;
my $compare_y = $user_input_y;
my $op = <some safe non-user-input, or otherwise checked against a safe list>;
if ( eval("\$compare_x $op \$compare_y") )
{
 ...
}

答案 1 :(得分:1)

简单地回答你的问题:是的。您可以绝对在变量中存储承诺。这正是我们承诺的原因。它允许我们&#34;存储&#34;一个可能尚不存在的值,因此我们可以轻松地将其传递给程序的其他部分。

最终,您仍然需要调用回调来获取内部值,使用.then或使用async / await过甜的糖。但是,在您准备好定义回调之前,您可以像其他任何值一样传递未来值。

但是,在您的示例中,我并不认为使用临时变量可以改善代码的逻辑或可读性。 (事实上​​,它根本不起作用,因为在if被调用之后,.then在3秒之后才会向返回的变量添加一个承诺。 )只需确保条件的每个分支都返回一个承诺,然后你就可以了。

&#13;
&#13;
function doSomething(condition){
    if (condition){
        //Do something async, like an AJAX call to an API
        return new Promise(resolve => {
          setTimeout(() => resolve('a'), 3000);
        })
    }
    //Don't actually need an else because if condition returns.
    //Do something synchronous, like setting a default value.
    return Promise.resolve('b');
}

doSomething(true)
  .then(value => console.log('c ' + value));
doSomething(false)
  .then(value => console.log('c ' + value));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

为何让它变得复杂?

let doSomething = condition => condition ? somethingAsync() : Promise.resolve('b'); 

函数总是会返回一个Promise,然后它会在事件循环的一个回合中解析还是3分钟

更新

这是一个带有一个返回的版本和一个Promise内的分支

let doSomething = condition => {
  return new Promise(resolve => {
    if (condition) {
      resolve(someAsyncThing());
    } else {
      resolve('b');
    }
  });
};

我仍然认为它比上面的版本更不易阅读和简单,但它是你的代码库,YMMV。