相关疑难解决方法(0)

承诺不仅仅是回调吗?

我已经开发了几年的JavaScript,我根本不理解有关承诺的大惊小怪.

似乎我所做的只是改变:

api(function(result){
    api2(function(result2){
        api3(function(result3){
             // do work
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以使用像async这样的库,例如:

api().then(function(result){
     api2().then(function(result2){
          api3().then(function(result3){
               // do work
          });
     });
});
Run Code Online (Sandbox Code Playgroud)

哪个代码更多,可读性更低.我没有在这里获得任何东西,它也不会突然神奇地"平坦".更不用说必须将事物转换为承诺.

那么,这里的承诺有什么大惊小怪?

javascript callback promise q bluebird

402
推荐指数
7
解决办法
9万
查看次数

从Swift函数中的异步调用返回数据

我在Swift项目中创建了一个实用程序类来处理所有REST请求和响应.我已经构建了一个简单的REST API,因此我可以测试我的代码.我创建了一个需要返回NSArray的类方法,但由于API调用是异步的,我需要从异步调用中的方法返回.问题是异步返回void.如果我在Node中执行此操作,我会使用JS承诺,但我无法找到适用于Swift的解决方案.

import Foundation

class Bookshop {
    class func getGenres() -> NSArray {
        println("Hello inside getGenres")
        let urlPath = "http://creative.coventry.ac.uk/~bookshop/v1.1/index.php/genre/list"
        println(urlPath)
        let url: NSURL = NSURL(string: urlPath)
        let session = NSURLSession.sharedSession()
        var resultsArray:NSArray!
        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            println("Task completed")
            if(error) {
                println(error.localizedDescription)
            }
            var err: NSError?
            var options:NSJSONReadingOptions = NSJSONReadingOptions.MutableContainers
            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: options, error: &err) as NSDictionary
            if(err != nil) {
                println("JSON Error \(err!.localizedDescription)")
            }
            //NSLog("jsonResults %@", jsonResult)
            let results: …
Run Code Online (Sandbox Code Playgroud)

rest asynchronous ios swift

83
推荐指数
4
解决办法
5万
查看次数

为什么Promises Monads?

我一直在学习函数式编程,并且遇到了Monads,Functors和Applicatives.

根据我的理解,以下定义适用:

a)(A => B)=> C [A] => C [B] | 函子

b)(A => C [B])=> C [A] => C [B] | 单子

c)(C [A => B])=> C [A] => C [B] | 合用的

(参考:https://thedet.wordpress.com/2012/04/28/functors-monads-applicatives-can-be-so-simple/)

此外,我了解Monad是Functor的一个特例.在中,它应用一个函数,该函数将包装值返回到包装值并返回包装值.

当我们使用时Promise.then(func),我们传递Promise(即C [A])一个通常具有签名A => B并返回另一个Promise(即C [B])的函数.所以我的想法是,Promise只是一个Functor而不是Monad,因为func返回B而不是C [B].

然而,谷歌搜索我发现Promise不仅是一个Functor,也是一个Monad.我想知道为什么,因为func不会返回包裹值C [B]但只是B.我错过了什么?

javascript monads functional-programming functor es6-promise

22
推荐指数
4
解决办法
6141
查看次数

AngularJS:如何压扁这个Promise链?

我有以下代码:

someService.fnReturnsPromise()
    .then(function () {
        return someService.fnReturnsAnotherPromise(someArg);
    })
    .then(function (resultsOfSecondFn) {
        // do stuff with results
    });
Run Code Online (Sandbox Code Playgroud)

我觉得这应该有效; 然而,resultsOfSecondFn实际上并不是结果,而是我回来的承诺本身.为了让它按照我想要的方式工作,我必须这样做:

someService.fnReturnsPromise()
    .then(function () {
        return someService.fnReturnsAnotherPromise(someArg);
    })
    .then(function (promiseReturn) {
        promiseReturn.then(function (results) {
            // do stuff with results
        });
    });
Run Code Online (Sandbox Code Playgroud)

这是伪代码fnReturnsAnotherPromise:

someService.fnReturnsAnotherPromise = function (arg1) {
    return anotherService.anotherFnThatReturnsPromise(arg1);
};
Run Code Online (Sandbox Code Playgroud)

所以真的,它只是一个额外的层,但承诺是以任何一种方式返回.代码anotherFnThatReturnsPromise是一些简单的范例$q.defer(),return dfd.promise有些resolve()是s.

javascript chaining promise angularjs angular-promise

4
推荐指数
1
解决办法
3500
查看次数

为什么JS承诺A +创建/履行/拒绝不属于规范的一部分?

http://promisesaplus.com/

最后,核心Promises/A +规范没有涉及如何创建,实现或拒绝承诺,而是选择专注于提供可互操作的方法.配套规范中的未来工作可能涉及这些主题.

作为一个功能开发人员,我通常会处理monad和operator之类的操作,point bind map或者flatMap链接一些包含在monad框内的调用.

根据这个问题的js递延/无极/未来相比,比如Scala函数式语言,在mapflatMap运营商似乎在融化在一起then的JS规范,可能是因为它不会赚那么多有意义的像的JS动态类型语言同时提供(?)并且使用和记住单个操作符更方便.


到目前为止一直很好,有一个then运营商(似乎并不总是正确实施)

但为什么承诺创建/履行/拒绝不是规范的一部分?这就像只有半个monad :( 似乎我不是唯一抱怨的人

通常,我的问题是:

  • 我想创建一个JS库
  • 我想公开一个基于promise的API
  • 我希望客户端选择他想要使用的promise实现

那我该怎么办?

我可以在我的图书馆里创建承诺

Q.fcall(function () {
    return 10;
})
Run Code Online (Sandbox Code Playgroud)

好的很酷,我只是将我的库耦合到Q :(

那么,这个问题有什么解决方案吗?库作者如何创建他暴露给API的承诺而不与实现相结合?

是否有一些免许可证的最低可行承诺A +库可以嵌入我们的库或其他东西?

这个规格选择背后的原因是什么?

javascript promise jquery-deferred q rsvp.js

3
推荐指数
1
解决办法
339
查看次数