javascript的語(yǔ)法自測(cè)(異步)

之前介紹過(guò)這個(gè)作者給的 javascript的語(yǔ)法自測(cè)(數(shù)組)
現(xiàn)在我們聊一聊異步的事情。

async

首先是最外層的測(cè)試,給了一個(gè)回調(diào)done,然后在兩次調(diào)用finish()的時(shí)候,調(diào)用done。

it('you should understand how to use promises to handle asynchronicity', function(done) {
  var flag = false;
  var finished = 0;
  var total = 2;

  function finish(_done) {
    if (++finished === total) { _done(); }
  }

  asyncAnswers.async(true).then(function(result) {
    flag = result;
    expect(flag).to.eql(true);
    finish(done);
  });

  asyncAnswers.async('success').then(function(result) {
    flag = result;
    expect(flag).to.eql('success');
    finish(done);
  });

  expect(flag).to.eql(false);
});

測(cè)試代碼比較簡(jiǎn)單,需要保證then執(zhí)行的回調(diào)函數(shù)的輸入是async的輸入,所以我新返回了一個(gè)promise,在支持promise的瀏覽器里面是可以測(cè)試通過(guò)的

async: function(value) {
  return new Promise(function (resolve) {
    resolve(value);
  });
},

當(dāng)然也可以通過(guò)語(yǔ)法糖

async: function(value) {
  return Promise.resolve(value);
}

作者的答案,利用了Jquery的Deferred

 async: function(value) {
    var dfd = $.Deferred();
    setTimeout(function() {
      dfd.resolve(value);
    }, 10);
    return dfd.promise();
  },

manipulateRemoteData

題目要求獲得json數(shù)據(jù),并進(jìn)行name的提取和排序
json數(shù)據(jù)如下

{
  "people" : [
    { "name" : "Matt" },
    { "name" : "Rebecca" },
    { "name" : "Paul" },
    { "name" : "Alex" },
    { "name" : "Adam" }
  ]
}

斷言

 it('you should be able to retrieve data from the server and return a sorted array of names', function(done) {
    var url = '/data/testdata.json';

    asyncAnswers.manipulateRemoteData(url).then(function(result) {
      expect(result).to.have.length(5);
      expect(result.join(' ')).to.eql('Adam Alex Matt Paul Rebecca');
      done();
    });
  });

我用promise寫(xiě)的代碼

manipulateRemoteData: function(url) {
  return Promise.resolve($.ajax(url)).then(function (value) {
    var res = [];
    var people = value.people;
    for(var i=0;i<people.length;i++){
      res.push(people[i].name);
    }
    return res.sort();
  })
}

作者給的代碼,用了一下map


  manipulateRemoteData: function(url) {
    var dfd = $.Deferred();

    $.ajax(url).then(function(resp) {
      var people = $.map(resp.people, function(person) {
        return person.name;
      });
      dfd.resolve(people.sort());
    });

    return dfd.promise();
  }
};

嘗試一些使用 promise寫(xiě)異步

    return new Promise(function (resolve,reject) {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function () {
          if (xhr.readyState == 4) {
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
              resolve(xhr.responseText);
            } else {
              reject(xhr.status);
            }
        }
       xhr.open("get","url",true);
       xhr.send()
      }
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語(yǔ)言太重要。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線(xiàn)程”的,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,405評(píng)論 5 22
  • Promise的含義: ??Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,270評(píng)論 0 16
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,227評(píng)論 0 12
  • 昨日A股市場(chǎng)整體呈現(xiàn)震蕩上行態(tài)勢(shì)。滬深兩市小幅高開(kāi),盤(pán)初石油、銀行等藍(lán)籌股活躍,帶動(dòng)股指震蕩走高,但由于創(chuàng)業(yè)板呈現(xiàn)...
    牛眼看盤(pán)閱讀 249評(píng)論 1 1
  • 作者:王阿正 01 站在雙流鎮(zhèn)不高的城郭上往西南方瞧去,一小塊黃色琉璃頂在團(tuán)團(tuán)綠木的掩映下忽隱忽現(xiàn),那里坐落著當(dāng)?shù)?..
    王阿正閱讀 653評(píng)論 2 4

友情鏈接更多精彩內(nèi)容