Promise 对象有以下两个特点:
1。对象的状态不收外接影响。有3种状态: pending(进行中)、Fulfilled(已成功)和Rejected(已失败)
2. 一旦状态改编就不会再变
14.2
var promise = new Promise(function (resolve, reject) {
// ... some code
if(/* 异步操作成功 */) {
resolve(value);
} else {
reject(error);
}
})
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
})
}
timeout(100).then((value) => {
console.log(value);
});
let promise = new Promise(function (resolve, reject) {
console.log('Promise');
resolve();
reject();
})
promise.then(function () {
console.log("Resolved.");
}, function() {
console.log("reject.");
})
console.log("Hi!");
//异步加载图片
function loadImageAsync(url) {
return new Promise(function (resolve, reject) {
var image = new Image();
image.onload = function () {
resolve(image);
};
image.onerror = function () {
reject(new Error('Could not load image at ' + url));
};
image.src = url;
})
}
14.3
var getJSON = function (url) {
var promise = new Promise(function (resolve, reject) {
var client = new XMLHttpRequest();
client.open("get", url);
client.onreadystatechange = handler;
client.responseType = 'json';
client.setRequestHeader('Accept', 'application/json');
client.send();
function handler () {
if(this.readyState !== 4) {
return ;
}
if(this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.stausText));
}
};
});
return promise;
}
getJSON("posts.json").then(function (json) {
console.log("Contents: " + json);
}, function (error) {
console.error("出错了", error);
})
getJSON("/api/articles?type=more&category=home&shown_offset=1578406645819228").then(function (json) {
console.log("Contents: " + json);
return json;
}, function (error) {
console.error("出错了", error);
}).then(function(json) {
console.log("then two " + json);
return JSON
}).then(function(json) {
console.log("then three " + json)
})
getJSON("/post/1.json").then(function (post) {
return getJSON(post.commentURL);
}).then(function(comments) {
console.log("Resolved: ", comments);
}, function() {
console.log("Rejected: ", err);
});
14.4
getJSON('/posts.json').then(function (posts) {
// ...
}).catch(function (error) {
// 处理 getJSON 和前一个回调很熟运行时发生的错误;
console.log("发生错误! ", error);
});
p.then((val) => console.log('fulfiled: ', val))
.catch((err) => console.log('rejected', err))
// 等同于
p.then((val) => console.log('fulfiled: ', val))
.then(null, (err) => console.log('rejected', err))
var promise = new Promise(function (resolve, reject) {
throw new Error('text')
});
promise.catch(function (error) {
console.log(error);
});
// 写法一
var promise = new Promise(function (resolve, reject) {
try {
throw new Error('test');
} catch(e) {
reject(e);
}
});
promise.catch(function (error) {
console.log(error);
})
//写法二
var promise = new Promise(function (resolve, reject) {
reject(new Error('test'));
})
promise.catch(function (error) {
console.log(error);
});
// bad
promise
.then(function (data) {
// success
}, function (err) {
// error
})
// good
promise
.then(function (data) {
// success
})
.catche(function (err) {
// err
});
14.5 Promise.all()
var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises)
.then(function (posts) {
// ...
}). catch(function (reason) {
// ...
});
const databasePromise = connectDatabase();
const booksPromise = databasePromise
.then(findAllBooks);
const userPromise = databasePromise
.then(getCurrentUser);
Promise.all([
booksPromise,
userPromise
])
.then(([books, user]) => picktopRecommentations(books, user));
14.6 Promise.race()
const p = Promise.race([
fatch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
]);
p.then(response => console.log(response));
p.catch(error => console.log(error));
14.7 Promise.resolve()
14.8 Promise .reject()
14.ll Promise.try()