我有以下代码:
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
我错过了什么?
答案 0 :(得分:3)
您的循环位于传递给new Promise
的回调中。这个函数叫做'executor':
function executor(resolve, reject)
执行者被new Promise
称为同步。执行程序的作用是设置任何异步事件,以便最终调用resolve
或reject
。
请参阅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是一个带有事件循环的单线程。 .then
和
setTimeout
安排活动。
所有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");