Promise

学习笔记,非原创

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数——更合理和更强大。

Promise特点
  • 所谓Promise,简单说就是一个容器对象,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

  • Promise对象代表一个异步操作,有三种状态:Pending(进行 中)、Resolved(已完成,又称 Fulfilled)和Rejected(已失 败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态

  • 一旦状态改变,就不会再变化,任何时候都可以得到这个结果。 (Promise对象的状态改变,只有两种可能:从Pending变为 Resolved和从Pending变为Rejected)

  • Promise对象一旦创建就会立即执行,但无法中途取消。

基本用法
// promise
var promise = new Promise(function(resolve, reject) {
// ... some code
    var flag = true; /* 异步操作成功 */
    if (flag){
        resolve('success');
    } else {
        reject('fail');
    }
});
promise.then(function(value) {
// success
    console.log('成功信息:', value)
}, function(error) {
// failure
    console.log('失败信息:', error)
});
定时器
function timer(ms) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve('done');
        }, ms);
    });
}
timer(1000).then(function(value) {
    console.log(value);
});
请求图片
function loadImageAsync(url) {
    var promise;
    return promise;
};
var imageUrl = 'http://img.pconline.com.cn/images/bbs4/20096/14/1244961943203.jpg';
loadImageAsync(imageUrl).then(function(image) {
    console.log('image -> ', image);
}, function(error) {
    console.log(error);
});
请求数据
function getJSON(url) {
    var promise;
    return promise;
}
var jsonUrl = 'http://facebook.github.io/react-native/movies.json';
getJSON(jsonUrl).then(function(json) {
    console.log('Contents: ' + json);
}, function(error) {
    console.error('出错了', error);
});
多次请求
var jsonUrl = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/Mo
var jsonUrl2 = 'http://facebook.github.io/react-native/movies.json';

function getText(url) {
    var promise;
    return promise;
}
getText(jsonUrl)
    .then(function (jsonText) {
        return jsonText;
    })
    .then(function (jsonText) {
        return JSON.parse(jsonText);
    })
    .then(function (json) {
        console.log('url1 json = ', json);
        return getText(jsonUrl2);
    })
    .then(function (jsonText) {
        console.log('url2 json: ', JSON.parse(jsonText));
    })
    .catch(function (err) {
        console.log(err);
    });
并行请求
function timeout(ms) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(ms + 'ms done!');
        }, ms);
    });
}
var promise1 = timeout(1000);
var promise2 = timeout(5000);
Promise.all([promise1, promise2]).then(function(results) {
    console.log('results = '
        , results)
});
竞争请求
function timeout(ms) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            reject(ms + 'ms timeout!');
        }, ms);
    });
}
function timer(ms) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(ms + 'ms done!');
        }, ms);
    });
}
var promise1 = timeout(1000);
var promise2 = timer(5000);
Promise.race([promise1, promise2]).then(function(results) {
    console.log('results = ', results)
}).catch(function(err) {
    console.log('err = ', err);
});

async/await

async 函数,使得异步操作变得更加方便

基本使用
function getJSON(url) {
    var promise;
    return promise;
}
var jsonUrl = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/Mo
var jsonUrl2 = 'http://facebook.github.io/react-native/movies.json';
var getData = async function () {
    try {
        var data1 = await getJSON(jsonUrl);
        var data2 = await getJSON(jsonUrl2);
        console.log('data1 = ', data1);
        console.log('data2 = ', data2);
    } catch(err) {
        console.log(err);
    }
};
var promise = getData();
console.log('这行代码在异步方法返回结果前执行。。。');
console.log('async 函数返回一个promise对象', promise);
Promise.all
function getJSON(url) {
    var promise;
    return promise;
}
var jsonUrl = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/Mo
var jsonUrl2 = 'http://facebook.github.io/react-native/movies.json';
var getData = async function () {
    try {
        var promise1 = getJSON(jsonUrl);
        var promise2 = getJSON(jsonUrl2);
        var results = await Promise.all([promise1, promise2]);
        console.log('results = ', results);
    } catch(err) {
        console.log(err);
    }
};
getData();
Promise.race
function timeout(ms) {
    return new Promise(function(resolve, reject) {
    //...
    });
}
function timer(ms) {
    return new Promise(function(resolve, reject) {
    //...
    });
}
var getData = async function () {
    try {
        var promise1 = timeout(1000);
        var promise2 = timer(500);
        var result = await Promise.race([promise1, promise2]);
        console.log('result = ', result);
    } catch(err) {
        console.log('err = ', err);
    }
};
getData();
async 函数嵌套
function getJSON(url) {
//...
    return promise;
}
var jsonUrl2 = 'http://facebook.github.io/react-native/movies.json';
var getData = async function (url) {
    return await getJSON(url);
};
var getDataWrapper = async function () {
    try {
        var data1 = await getData(jsonUrl2);
        console.log('data1 = ', data1);
    } catch(err) {
        console.log(err);
    }
};
getDataWrapper();

results matching ""

    No results matching ""