Promise 异步执行的同步操作
Promise 是用来执行异步操作的。
但有时一个异步操作需要等其他的异步操作完成,这时候就可以使用then来做。
function loadImageAsync(url) {
return new Promise(function(resolve, reject) {
var image = new Image(); image.onload = function() {
console.log("load");
resolve(image);
}; image.onerror = function() {
reject(new Error('Could not load image at ' + url));
};
console.log("change src");
function init_img() {
image.src = url;
}
setTimeout(init_img,2000);
});
}
loadImageAsync 用来异步加载图片. setTimeout 人为地延迟2秒加载
function loadImageAsync2(url) {
return new Promise(function(resolve, reject) {
var image = new Image(); image.onload = function() {
console.log("2load");
resolve(image);
}; image.onerror = function() {
reject(new Error('Could not load image at ' + url));
};
console.log("2change src");
function init_img() {
image.src = url;
}
setTimeout(init_img,1000);
});
}
loadImageAsync2 也是用来加载图片,人为地延迟1秒。
var p = loadImageAsync('http://img02.tooopen.com/images/20141231/sy_78327074576.jpg');
p.then(function (img) {
console.log("1:"+img.src);
});
var h = loadImageAsync2('http://img02.tooopen.com/images/20141225/sy_77944235469.jpg');
h.then(function (img) {
console.log("2:"+img.src);
});
console.log("jjjjj");
第一种调用方式,分别创建promise 实例 p 和 h。
调用结果:
可以看到 图片2先加载, 然后加载图片1 。
var s = loadImageAsync('http://img02.tooopen.com/images/20141231/sy_78327074576.jpg');
s.then(function (img) {
console.log("1:"+img.src);
return loadImageAsync2('http://img02.tooopen.com/images/20141225/sy_77944235469.jpg');
}).then(function (img) {
console.log("2:"+img.src);
});
创建新的promise 对象 s. 我们在s 的then 成功回调函数中 去调用 loadImageAsync2 函数。
这样就保证了 加载图片2 之前先加载图片1.
这里注意的是第二个then 其实是loadImageAsync2 返回的promise 实例调用的。
Promise相关学习链接:http://es6.ruanyifeng.com/#docs/promise
Promise 异步执行的同步操作的更多相关文章
- asap异步执行实现原理
目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...
- Promise then中回调为什么是异步执行?Promise执行机制问题
今天发现一个问题,看下方代码 let p = new Promise(function(resolve, reject) { resolve() console.log('); }); p.then( ...
- 学习Promise异步编程
JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...
- 超耐心地毯式分析,来试试这道看似简单但暗藏玄机的Promise顺序执行题
壹 ❀ 引 就在昨天,与朋友聊到JS基础时,她突然想起之前在面试时,遇到了一道难以理解的Promise执行顺序题.由于我之前专门写过手写promise的文章,对于部分原理也还算了解,出于兴趣我便要了这 ...
- Js中强大的Promise异步机制
少年别激动 我的这份随笔里面只涉及promise概念 如果想深入了解Promise的用法 可以去阮老师es6入门里面详读 奉上链接 http://es6.ruanyifeng.com/#docs/pr ...
- ES6笔记(7)-- Promise异步编程
系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...
- 【ES6】Generator+Promise异步编程
一.概念 首先我们要理解Generator和Promise的概念. Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态. *Foo(){ yeild consol ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
- 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)
https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...
随机推荐
- [置顶] 【VB.NET2010】注册表写入方法
这里,以添加启动项为例: Imports Microsoft.Win32 Imports System.Reflection.Assembly Private Sub SetAuto_Click( ...
- Win32多线程编程(2) — 线程控制
Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...
- jquery之onblur事件
onblur事件与html结合 function discountCheck(){ //var checkVal=$('input:text[name="Fee1"]').val( ...
- 给linux设置grub密码
一.明文加密:vim /etc/grub.conf在hiddemenu下面新增一行,输入:password 密文然后:wq保存退出 在开机出现退数菜单的时候,按任意键,就会出现启动选择菜单,这时下面的 ...
- Csharp 高级编程 C7.1.2
第七章 代理(1) 一.代理要声明 二.代理使用步骤 声明代理 初始化代理(使用 实例的方法名 作为参数) 使用代理 代码示例: /*C7.1.2*/ using System; using Syst ...
- UIAlertController的创建以及添加
个人还是更喜欢以前的UIAlertView的创建方法,更新后的UIAlertController虽然说将UIAlertView和UIActionSheet的功能和作用以一种模块化替换的方式来代替,但是 ...
- 记一次令人发狂的 bug Eclipse 开不开 tomcat 7.0
改项目,结果发现以前的项目也出了问题,就删除了系统用户下面workplace里的文件夹,结果,eclipse被清空,重新添加项目,发现一堆bug; 最让我崩溃的是,用tomcat 7.0跑项目,反复出 ...
- <c:if>标签
<c:if>的用途就和我们一般在程序中用的if一样. 语法 语法1:没有本体内容(body) <c:if test="testCondition" var=&qu ...
- 初学 Play Framework 以及可能遇到的问题
这段话之后都是我从别人那拷贝过来的资料,方便大家查阅 红色标注字体是我自己遇到的一些问题: 如果你遇到了这样的问题 :
- a foreign key constraint fails
今天遇到一个问题,一对一级联保存时,报错如下: Cannot add or update a child row: a foreign key constraint fails 解决方法: MySQL ...