function test2() {
for (let i = 0; i < 3; i++) {
waitMinutes()
console.log(i)
function waitMinutes() {
setTimeout(() => {
console.log('等2秒');
}, 2000);
test()
虽然setTimeout是放在前面,好像要按顺序执行的话是打印:
这是期待的打印结果,但根据口诀同步优先、异步靠边、回调垫底! ,实际结果是:

同步优先,所以先打印循环的,异步靠边,异步要等同步打印完毕才会执行!
再加个回调进去看效果,最常见的回调就是JQuery的http调用了,看代码
function test3() {
for (let i = 0; i < 3; i++) {
checkGitHubStatus();
waitMinutes()
console.log(i)
function waitMinutes() {
setTimeout(() => {
console.log('等2秒');
}, 2000);
function checkGiteeStatus() {
$.ajax({
type: "GET",
url: "https://gitee.com/api/v5/emojis",
success: function (data, status) {
if (status == "success") {
console.log("跟gitee通讯正常!");
error: function (xhr, errorText, errorType) {
complete: function () {
test3()
期待的打印结果是:
跟gitee通讯正常!
跟gitee通讯正常!
跟gitee通讯正常!
但根据口诀同步优先、异步靠边、回调垫底! ,回调永远是最后才运行的,实际结果是:

到这里,对这句口诀的理解应该是很充分了。但这不是我们的目的,我们就是要让这代码按我们期待的结果运行,怎么办?这时候就需要用到async+await+promise了。
async+await是es7提出来的概念,它也是为了解决回调地狱的问题,它只是一种语法糖,从本质上讲,await函数仍然是promise,值得注意的是,async和await必须要一起使用。
用法:首先在 function 前面加 async 用来说明这个函数是一个异步函数
然后在async里面写await
先来实现这个效果:
代码如下:
async function test4() {
for (let i = 0; i < 3; i++) {
await waitMinutes2()
console.log(i)
function waitMinutes2() {
var p = new Promise(function (resolve, reject) {
setTimeout(() => {
console.log('等2秒');
resolve("等完了")
}, 2000);
}); return p;
test4()
再来实现这个效果:
跟gitee通讯正常!
跟gitee通讯正常!
跟gitee通讯正常!
代码如下:
async function test4() {
for (let i = 0; i < 3; i++) {
await checkGiteeStatus2();
await waitMinutes2()
console.log(i)
function waitMinutes2() {
var p = new Promise(function (resolve, reject) {
setTimeout(() => {
console.log('等2秒');
resolve("等完了")
}, 2000);
}); return p;
function checkGiteeStatus2() {
var p = new Promise(function (resolve, reject) {
$.ajax({
type: "GET",
url: "https://gitee.com/api/v5/emojis",
success: function (data, status) {
if (status == "success") {
console.log("跟gitee通讯正常!");
resolve("通讯结束!")
error: function (xhr, errorText, errorType) {
complete: function () {
}); return p;
test4()
切记,resolve()函数必须实现,调用了resolve()的意思就是这个方法调用结束了。promise是靠状态来判断的,不调用resolve()它会认为一直没有结束,就直接卡住了。而且resolve()这个括号里可以直接赋值对象,比如上面的例子,调用某个接口得到的值可以直接赋值给resolve(data),这样的话,调用checkGiteeStatus2()这个方法的调用方,可以通过then获取checkGiteeStatus2()得到的值,做链式调用。
function test5() {
checkGiteeStatus2()
.then(function (data) {
console.log(data)
});
function checkGiteeStatus2() {
var p = new Promise(function (resolve, reject) {
$.ajax({
type: "GET",
url: "https://gitee.com/api/v5/gitignore/templates",
success: function (data, status) {
if (status == "success") {
console.log("跟gitee通讯正常!");
resolve(data)
error: function (xhr, errorText, errorType) {
complete: function () {
}); return p;
test5();
理论上可以一直then下去,这个用于某些需求,比如,调用第一个接口获得的数据给第二个接口用,然后第三个接口再拿第二个接口的数据去处理等。
本文成于2019年12月25日先介绍一下promise,参考的是这篇文章,看完就懂了 https://www.jianshu.com/p/57ceb7ac5ab3简单介绍下promisePromise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。那就new一个var p = new Promise(func...
暂停node / iojs异步运行循环,直到您调用done()回调。
与 yield 类似,stall 会暂停 node/iojs 默认运行循环。 它将阻塞其周围上下文中的所有其他内容,直到设置完成标志:调用 done() 将上下文程序流恢复到正常的 asyc
$ npm install stall
var stall = require ( 'stall' )
//template for a sleep function
var sleep = stall ( function ( timeout , done ) {
//just make sure to call done() to yield back the event loop
setTimeout ( done , timeout )
console . log ( 'this
yarn add react-script-async
这个怎么运作
该库使用渲染道具来渲染某些元素,无论是否加载了脚本。 通常会传递给常规[removed]标记的所有道具都将传递。
import React from 'react' ;
import Script from 'react-script-async' ;
export default ( ) => (
< Script src = "some_script.js" >
{ ( { loaded } ) => ( loaded ? < div> hurray ! < / div > : < div> Loading... < / div > ) }
去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范。作为ES6中最重要的特性之一,我们有必要掌握并理解透彻。本文将由浅到深,讲解Promise的基本概念与使用方法。
ES6 Promise 先拉出来遛遛
复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受。那么第一个问题来了,Promise是什么玩意呢?...
new Promise使用一、Promise.all二、promise.then
一、Promise.all
let arr = ['a', 'b', 'c', 'd']
let list = []
for (let index = 0; index < arr.length; index++) {
const element = arr[index];
var currentData = new Promise(function (resolve, reject) {
for循环执行流程:
1.先执行初始化表达式(初始化表达式只会执行一次)
2.再执行条件表达式,判断是否执行循环,值为true,则执行循环大括号{}里的语句,值为false,终止循环