promise的初步认识,求批。
发布于 9 年前 作者 moxiaobei2 3375 次浏览 最后一次编辑是 8 年前 来自 分享

嵌套调用,上一个结果是后一个函数的请求参数,或者所有的函数完成之后才能去做一件事 例子:

    var Q = require("q");
			  var fun1 = function (data) {
			  var deferred = Q.defer();
			  deferred.resolve(data+" fun1");
			  return deferred.promise;
			  }
	
  var fun2 = function (data) {
		  var deferred = Q.defer();
		  deferred.resolve(data+" fun2");
		  return deferred.promise;//返回的是promise对象 这里的resolve的结果将作为下一个promise的参数结果
  }

var fun3 = function (data) {
		var deferred = Q.defer();
		deferred.resolve(data+" fun3");
		return deferred.promise;
}

var fun4 = function (data) {
			var deferred = Q.defer();
			deferred.resolve(data+" fun4");
			return deferred.promise;
}

function main(data,cb){
		  fun2("test")
		  .then(fun3)
		  .then(fun4)
		  .done(function(data){//.done用来返回最终的结果
		  console.log(data);//test fun2 fun3 fun4
		  },function(err){
			//failed
		  });
}
  function main2() {
		Q.all([
			  fun1("test1"), fun2("test2"), fun3("test3")
			 ]).spread(function () {
			                 console.log(arguments);
	      	                //结果如下: { '0': 'test1 fun2', '1': 'test2 fun3', '2': 'test3 fun4' }
 		             	});
   }
 main();
 main2();
          **上述直接运行即可。**(ps:上面只是个例子,下面部分是初步调用的具体例子)

=====================================================================================

  下面是对微信请求接口的一个封装,用的就是Promise的思想。
var http=require("https");
var parse = require('url').parse;
var setting = require('../setting.js');
var iconv = require('iconv-lite');
var Q = require("q");
//任用promise 思想来处理回调函数
	function get(url){
	  var info=parse(url);
	  var deferred = Q.defer();
	  var options = {
	  hostname: info.hostname,
	  port: info.port,
	  path: info.path,
	  method: 'GET'
	  };
	  var req = http.request(options, function (res) {
					res.on('data', function (chunk) {
					deferred.resolve(chunk);
					});
	              });

		req.on('error', function (e) {
		deferred.register();
		});
       req.end();
       return deferred.promise;
 }
 
var getAcToUrl=function(){
		var acToUrl='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='+setting.appid+'&secret='+setting.secret;
		return get(acToUrl);
}

var getTicketUrl= function(data){
		  var data=JSON.parse(iconv.decode(data,"UTF-8"));
		  var ticketUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+data.access_token+"&type=jsapi";
		  return get(ticketUrl);
  }
  
  var getMessage=function(callback){
    getAcToUrl().then(getTicketUrl).done(callback);
}

      exports.getMessage=getMessage;
  求批~~看各路大神有无其他方法。
4 回复

这样的格式谁能看懂啊

@i5ting 我表示同意 今天刚用了markdown 自豪地采用 CNodeJS ionic

好好用MD吧。

@i5ting 好吧,这里的提交问题。

回到顶部