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 异步执行的同步操作的更多相关文章

  1. asap异步执行实现原理

    目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...

  2. Promise then中回调为什么是异步执行?Promise执行机制问题

    今天发现一个问题,看下方代码 let p = new Promise(function(resolve, reject) { resolve() console.log('); }); p.then( ...

  3. 学习Promise异步编程

    JavaScript引擎建立在单线程事件循环的概念上.单线程( Single-threaded )意味着同一时刻只能执行一段代码.所以引擎无须留意那些"可能"运行的代码.代码会被放 ...

  4. 超耐心地毯式分析,来试试这道看似简单但暗藏玄机的Promise顺序执行题

    壹 ❀ 引 就在昨天,与朋友聊到JS基础时,她突然想起之前在面试时,遇到了一道难以理解的Promise执行顺序题.由于我之前专门写过手写promise的文章,对于部分原理也还算了解,出于兴趣我便要了这 ...

  5. Js中强大的Promise异步机制

    少年别激动 我的这份随笔里面只涉及promise概念 如果想深入了解Promise的用法 可以去阮老师es6入门里面详读 奉上链接 http://es6.ruanyifeng.com/#docs/pr ...

  6. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  7. 【ES6】Generator+Promise异步编程

    一.概念 首先我们要理解Generator和Promise的概念. Generator:意思是生成器,可以在函数内部通过yeild来控制语句的执行或暂停状态. *Foo(){ yeild consol ...

  8. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

  9. 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)

    https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...

随机推荐

  1. wpf新增记录时用多线程的问题

    多线程虽然可以增加用户操作体验,但是有时候会出现意想不到的错误. 如果采用分布式,数据库在另外服务器上,当网络出现问题,或者数据库繁忙,那么新增数据就会等待,这时候用户如果以为没有操作,而多次点击新增 ...

  2. [华为机试练习题]55.最大公约数 & 多个数的最大公约数

    题目 描写叙述: 输入2个数字,最后输出2个数字的最大公约数 题目类别: 位运算 难度: 0基础 执行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 2个整数 输出: 输出数字1和 ...

  3. mysql常用操作(转自阿铭linux)

    在前面两个章节中已经介绍过MySQL的安装了,但是光会安装还不够,您还需要会一些基本的相关操作.当然了,关于MySQL的内容也是非常多的,只不过对于linux系统管理员来讲,一些基本的操作已经可以应付 ...

  4. Eclipse下绿色安装插件Aptana、Swing

    本文主要针对Ecplise下绿色安装插件,写本篇博客也是因为笔者在Ecplise下安装Aptana时不断安装出现错误,所以写下自己安装成功以及之前出错的原因,也搜集了许多资料在此一并总结一下吧! Ec ...

  5. arraylist与List<>

    arraylist 不用规定 类型 list<>用规定类型 推荐list 这个编译检查类型  出错率低 代码质量高

  6. 《第一行代码》学习笔记4-活动Activity(2)

    1.Toast是Android系统中一种好的提醒方式,程序中使用它将一些短小的信 息通知给用户,信息会在不久自动消失,不占用任何屏幕空间. 2.定义一个弹出Toast的出发点,界面有按钮,就让点击按钮 ...

  7. 微软HoloLens虚拟现实可以开发了。

    1.microsoft-hololens-now-available-to-developers 2.http://www.microsoft.com/microsoft-hololens/en-us ...

  8. C#基本数据类型与C++区别

    与C++不同的地方: char占两个字节存Unicode字符, long long 改为 long ; unsize ... 改为 u... 新增: byte占1个字节,类似与C++char, sby ...

  9. hdu5348 MZL's endless loop(欧拉回路)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's endless loop Time Limit: 3000/1500 ...

  10. JS小数位保留两位小数--toFixed()

    parseInt,parseFloat,parseDouble在JS中是将值转换成相应的类型: 你必须要这样,才能实现: <script>         alert(parseFloat ...