收集一系列成功的承诺

时间:2015-11-04 15:54:13

标签: swift promisekit

我在Swift中使用PromiseKit 3.0,我有一系列承诺<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ex.errorhandle" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name="com.ex.errorhandle.MyApp" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.ex.errorhandle.ServiceClass" /> </application> </manifest> 。我想把所有成功的承诺收集到一个单一的承诺中。 [Promise<Int>]

即使一个包含承诺拒绝,Promise<[Int]>when都会拒绝。根据文档,我应该能够使用join并且错误将包含已完成值的数组,但在Swift中,错误包含传递的所有承诺,而不是履行的值。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我现在看到我需要一个新功能:

https://gist.github.com/dtartaglia/2b19e59beaf480535596

/**
Waits on all provided promises.

`any` waits on all provided promises, it rejects only if all of the promises rejected, otherwise it fulfills with values from the fulfilled promises.

- Returns: A new promise that resolves once all the provided promises resolve.
*/
public func any<T>(promises: [Promise<T>]) -> Promise<[T]> {
    guard !promises.isEmpty else { return Promise<[T]>([]) }
    return Promise<[T]> { fulfill, reject in
        var values = [T]()
        var countdown = promises.count
        for promise in promises {
            promise.then { value in
                values.append(value)
            }
            .always {
                --countdown
                if countdown == 0 {
                    if values.isEmpty {
                        reject(AnyError.Any)
                    }
                    else {
                        fulfill(values)
                    }
                }
            }
        }
    }
}

public enum AnyError: ErrorType {
    case Any
}