كدهاي توليدي(producing code) كدي است كه ممكن است اجراي آن كمي طول بكشد .
كدهاي مصرفي(Consuming) آنهائي است كه منتظر نتايج توليدي هستند .
يك پروميس(promis) شئي است كه ارتباط مابين كدتوليدي و مصرفي را برقرار ميكند .
يك پروميس شامل كد توليدي و هم تماس با كدمصرف كننده است.
let myPromise = new Promise(function(myResolve, myReject) { // "Producing Code" (May take some time) myResolve(); // when successful myReject(); // when error }); // "Consuming Code" (Must wait for a fulfilled Promise) myPromise.then( function(value) { /* code if successful */ }, function(error) { /* code if some error */ } );
وقتي كه توليدكننده نتيجه را بدست آورد، بايد يكي از دوcallback را فرخواني كند .
وقوع يا هنگام | فراخواني |
---|---|
موفقيتSucess- | myResolve(result value) | خطا ـError | myReject(error object) |
يك شئpromise جاوااسكريپت ميتواند داراي شرايط زير باشد :
شئ پروميس از دو ويژگيstate وresult پشتيباني ميكند . هنگاميكه شئ در حال كاراست، يعني "pending"ويژگي result مقدارش undefined است .هنگاميكه شئ پروميس در حالت "fulfilled"يعني تحقق مي يابد، ويژگيresult داراي مقداراست. اما اگر وضعيت "Rejected"باشد، ويژگيresult دارايError object ميباشد.
جدول زير خلاصه آنرا بيان ميكند.
myPromise.state | myPromise.result | شـرح |
---|---|---|
"pending" | undefined | مقدار تعريف نشده |
"fulfilled" | a result value | ويژگيresult داراي مقدار |
"rejected" | a error object | اجراي ناموفق و حاصل ايجاد خطاي شئي |
نميتوان به ويژگي هايstate و result شئ Promise دسترسي داشت .
براي رسيدگي به وعده ها بايد از متدPromise استفاده كرد .
در زير چگونگي استفاده از يك پروميس آمده است.
myPromise.then( function(value) { /* code if successful */ }, function(error) { /* code if some error */ } );
Promise.then()داراي دوآرگومان است، يك تابع كال بك براي موفقيت وكال بك ديگري خطا .هر دو اختياري هستند، بنابراي ميتوان فقط براي موفقيت و يا شكست تابعي كال بك گذاشت.
مثال ـ نمونه استفاده از پروميس
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } let myPromise = new Promise(function(myResolve, myReject) { let x = 0; // The producing code (this may take some time) if (x == 0) { myResolve("OK"); } else { myReject("Error"); } }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
براي نشان دادن استفاده از پروميس ها ، از مثالهاي فصل قبلي كال بك استفاده ميشود:
مثال ـ استفاده از كال بك
setTimeout(function() { myFunction("I love You !!!"); }, 3000); function myFunction(value) { document.getElementById("demo").innerHTML = value; }
مثال ـ همان مثال با استفاده پروميس
let myPromise = new Promise(function(myResolve, myReject) { setTimeout(function() { myResolve("I love You !!"); }, 3000); }); myPromise.then(function(value) { document.getElementById("demo").innerHTML = value; });
مثال ـ استفاده از كال بك
function getFile(myCallback) { let req = new XMLHttpRequest(); req.open('GET', "mycar.html"); req.onload = function() { if (req.status == 200) { myCallback(req.responseText); } else { myCallback("Error: " + req.status); } } req.send(); } getFile(myDisplayer);
مثال ـ استفاده از پروميس
let myPromise = new Promise(function(myResolve, myReject) { let req = new XMLHttpRequest(); req.open('GET', "mycar.htm"); req.onload = function() { if (req.status == 200) { myResolve(req.response); } else { myReject("File not Found"); } }; req.send(); }); myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);} );
ECMAScript 2015كه با ES6 شناخته ميشود، شئ پروميس جاوااسكريپت را معرفي كرد .
در جدول زير اعداد اولين نسخه اي هستند كه از اشياء پروميس كاملا پشتيبباني ميكنند.
33
Feb 2014 | 12
Jul 2015 | 29
Apr 2014 | 7.1
Sep 2014 | 20
Mar 2014 |