包含for循环的基于Promise的函数不是异步运行的

时间:2017-05-26 12:28:22

标签: javascript asynchronous promise es6-promise

我有以下代码:

function asyncLoop() {
    return new Promise(function(res, rej) {
        for(let i=0;i<=400000000;i++) {
            if(i===400000000) {console.log("done"); res();}
        }
    });
}

asyncLoop().then(()=>{console.log("then")});
console.log("out");

我得到以下输出:

done
out
then

根据我对Promises的理解,asyncLoop应该是异步运行的,以下应该是输出:

out
done
then

我错过了什么?

3 个答案:

答案 0 :(得分:3)

您的循环位于传递给new Promise的回调中。这个函数叫做'executor':

function executor(resolve, reject)

执行者被new Promise称为同步。执行程序的作用是设置任何异步事件,以便最终调用resolvereject

请参阅MDN:fgetcsv

  

立即调用此函数,并将解析函数作为其两个参数。

     

在执行程序完成之前,构造函数不会返回

答案 1 :(得分:2)

你做了一个错误的假设。 Promise并不意味着异步,它们在异步上下文中使用,以便更轻松地处理调用。要制作流程&#34; async&#34;,您可以使用public function rules() { return [ [['email'], 'functionName'], [['lastname'], 'functionforlastName'], ];} public function functionName($attribute, $params) { $usercheck=User::find()->where(['email' => $email])->one(); if($usercheck) { $this->addError($attribute, 'Email already exists!'); } }

use yii\web\Response;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
     Yii::$app->response->format = Response::FORMAT_JSON; 
     return ActiveForm::validate($model); 
} 
else if ($model->load(Yii::$app->request->post())) 
{ 
    //place your code here 
}

答案 2 :(得分:1)

promise只是一个返回值,它附加回调而不是将回调传递给函数,这是一个有几个好处的约定。有关详情,请参阅MDN上的Using promises

JavaScript是一个带有事件循环的单线程。 .thensetTimeout安排活动。

所有JavaScript都在浏览器的主线程上运行,除非您创建worker

function asyncLoop() {
  for (let i = 0; i <= 400000000; i++) {
    if (i == 400000000) {
      self.postMessage('done');
    }
  }
}

var blob = new Blob(["onmessage = " + asyncLoop.toString()],
                    {type: "text/javascript"});

var worker = new Worker(window.URL.createObjectURL(blob));

worker.onmessage = e => console.log(e.data);
worker.postMessage("start");