Heim > Web-Frontend > js-Tutorial > Hauptteil

Asynchrone Programmierpraxis von when.js unter node.js_node.js

WBOY
Freigeben: 2016-05-16 16:29:19
Original
1495 Leute haben es durchsucht

Gehen Sie von einem Geschäftsszenario aus:

Rufen Sie die RSS-Datei über die RSS-Adresse ab und speichern Sie sie in der Datei. Die RSS-Adresse wird in der Datei gespeichert.

Um dieses Szenario abzuschließen, müssen Sie drei Aufgaben erledigen:

1. Lesen Sie die RSS-Adresse aus der Datei.

2. Holen Sie sich RSS.

3. In Datei speichern.

Integrieren Sie diese drei Aufgaben endlich.

Vorbereitung:

Die Datei, in der die RSS-Adresse gespeichert ist, address.txt.

http://programmer.csdn.net/rss_programmer.html

Aufgabe 1:

Lesen Sie den Inhalt der RSS-Adressdatei und senden Sie ihn per Rückruf zurück.

Code kopieren Der Code lautet wie folgt:

var getRssAddress = function(path, callback) {
fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
​ callback(err, data);
});
}

Mission 2:

Erhalten Sie RSS über die RSS-Adresse und geben Sie Fehler oder Daten per Rückruf zurück.

Code kopieren Der Code lautet wie folgt:

var getRss = function(url, callback) {
var data = '';
http.get(url, Funktion(res) {
res.on('data', function(chrunk) {
data = chrunk;
});
res.on('end', function() {
​​callback(null, data);
});
}).on('error', function(err) {
​ Rückruf(err, null);
});
}

Mission 3:

RSS in Datei speichern und Fehler durch Rückruf zurückgeben.

Code kopieren Der Code lautet wie folgt:

var saveRss = function(data, callback) {
fs.writeFile('rss.txt', data, 'utf8', function(err) {
​ Rückruf(err);
});
}

Integration:

Code kopieren Der Code lautet wie folgt:

getRssAddress('address.txt', function(err, data) {
if(err) {
console.log(err);
Zurück;
}
getRss(data, function(err, data) {
If(err) {
console.log(err);
Zurück;
}
SaveRss(data, function(err) {
If(err) console.log(err);
});
});
});

Der obige Code ist eine vollständig asynchrone Verarbeitung und verwendet den häufigsten Rückruf, um die Rückkehr der asynchronen Logik zu verarbeiten. Der Vorteil besteht darin, dass es sich um eine Standardschreibmethode handelt, die jeder problemlos akzeptieren kann. Die Behandlung von Ausnahmen ist mühsam und der Code ist nicht intuitiv, insbesondere wenn es um komplexe Geschäftslogik und mehrere Verarbeitungsaufgaben geht. Ebenen von Rückrufen können die Augen der Leute blenden und die Wartung des Codes erschweren.

when.js, eine der Implementierungen der Promise/A-Spezifikation, zielt auf diese Problemdomäne ab.

Werfen wir einen Blick auf den transformierten Code.

Mission 1:

Code kopieren Der Code lautet wie folgt:

var getRssAddress = function(path) {
var deferred = when.defer();
fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
If (err) deferred.reject(err);
        deferred.resolve(data);
});

return deferred.promise;
}



Mission 2:

Code kopieren Der Code lautet wie folgt:

var getRss = function(url) {
  var deferred = when.defer();
    var data = '';
    http.get(url, Funktion(res) {
      res.on('data', function(chrunk) {
        data = chrunk;
      });
      res.on('end', function() {
        deferred.resolve(data);
      });
    }).on('error', function(err) {
      deferred.reject(err);
    });

    return deferred.promise;
}

任务3:

复制代码 代码如下:

var saveRss = function(data) {
  var deferred = when.defer();
  fs.writeFile('rss.txt', data, 'utf8', function(err) {
    if(err) deferred.reject(err);
    deferred.resolve();
  });

  return deferred.promise;
}


 

整合:

复制代码 代码如下:

getRssAddress('address.txt')
  .then(getRss)
  .then(saveRss)
  .catch(function(err) {
    console.log(err);
  });

解释:

promise/A规范定义的„Deferred/Promise“模型就是“发布/订阅者“模型,通过Deferred对象发布事件,可以是完成resolve事件,或者是失败Ablehnen事件;通过Versprechen对象进行对应完成或失败的订阅.

在Promises/A规范中,每个任务都有三种状态:Ausstellung (ausstehend), Auslieferung (erfüllt) und Auslieferung (abgelehnt)。

1.默认状态可以单向转移到完成状态,这个过程叫resolve,对应的方法是deferred.resolve(promiseOrValue);

2.默认状态还可以单向转移到失败状态,这个过程叫reject,对应的方法是deferred.reject(reason);

3.默认状态时,还可以通过deferred.notify(update)来宣告任务执行信息,如执行进度;

4行过程中.

按照上面的代码.

通过when.defer定义一个deferred对象.

var deferred = when.defer();
异步数据获取成功后,发布一个完成事件.

deferred.resolve(data);
异步数据获取失败后,发布一个失败事件.

deferred.reject(err);
并且返回Promise对象作为订阅使用.

return deferred.promise;
订阅是通过Promise对象的then方法进行完成/失败/通知的订阅.

getRssAddress('address.txt')
  .then(getRss)
Dann wird die Funktion onFulfilled, onRejected, onProgress

angezeigt

promise.then(onFulfilled, onRejected, onProgress)
上一个任务被resolve(data),onFulfilled函数就会被触发,data作为它的参数.

上一个任务被reject(reason),那么onRejected就会被触发,收到reason.

任何时候,onFulfilled和onRejected都只有其一可以被触发,并且只触发一次

对于处理异常, when.js也提供了极其方便的方法, then能传递错误, 多个任务串行执行时, 我们可Klicken Sie dann auf „Abgelehnt“ und dann auf „Abgelehnt“. fangen函数捕获任何一个任务的异常.

如此写法简单明了.

复制代码 代码如下:

getRssAddress('address.txt')
  .then(getRss)
  .then(saveRss)
  .catch(function(err) {
    console.log(err);
  });

Versprechen给异步编程带来了巨大的方便,可以让我们专注于单个任务的实现而不会陷入金字塔厄运, 以上代码仅仅是基本使用, when.js提供的功能远远不止本文提到的这些,具体参照官方API。

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage