在循环回来之前等待http成功 - Angular 4

时间:2017-07-19 17:41:11

标签: javascript angular

感谢您在调试下面的问题时提供帮助。

当前状态

// Iteration #1 ( Logs )

index =  0
id = 0, deleted = 0
userIdfaList:: A,B,C,D

// after success
id --->  33
response::  Object {id: 33, name: "Test", deleted: 0, userIdfaList: Array(4)}

// Iteration #2 ( Logs )

index =  1
id = 0, deleted = 0
userIdfaList:: AA,BB,CC,DD

// after success
id --->  35
response::  Object {id: 35, name: "Test", deleted: 0, userIdfaList: Array(4)}

// Iteration #3 ( Logs )

index =  2
id = 0, deleted = 0
userIdfaList:: AAA,BBB,CCC,DDD

// after success
id --->  34
response::  Object {id: 34, name: "Test", deleted: 0, userIdfaList: Array(4)}

预期行为

在第一次成功回复时检索到id,将该id分配给其余批次。

// Iteration #1 ( Logs )

index =  0
id = 0, deleted = 0
userIdfaList:: A,B,C,D

// after success
id --->  33
response::  Object {id: 33, name: "Test", deleted: 0, userIdfaList: Array(4)}

// Iteration #2 ( Logs )

index =  1
id = 33, deleted = 0
userIdfaList:: AA,BB,CC,DD

// after success
id --->  33
response::  Object {id: 33, name: "Test", deleted: 0, userIdfaList: Array(4)}

// Iteration #3 ( Logs )

index =  2
id = 33, deleted = 0
userIdfaList:: AAA,BBB,CCC,DDD

// after success
id --->  33
response::  Object {id: 33, name: "Test", deleted: 0, userIdfaList: Array(4)}

component.ts

userAudience(name, userIdfaListArray){
    let id = null,
        deleted = null;
    for (let i=0;i<userIdfaListArray.length;i++){
        console.log("index = ", i);
        if (i == 0){ id = deleted = 0; }
        console.log(`id = ${id}, deleted = ${deleted}`);
        let userIdfaList = userIdfaListArray[i];
        console.log(`userIdfaList:: ${userIdfaList}`);
        this._audienceService.uploadMobileAdIds(id, name, deleted, userIdfaList)
        .subscribe(
            data => {
                if ( data.status === 'success' ) {
                    id = data.response.id;
                    console.log("id ---> ", id);
                    console.log("response:: ", data.response);
                    this.batchIds.push(data.response.userIdfaList);
                } else {
                    console.log(`errorcode: ${data.errorcode}`);
                    console.log(`error message: ${data.message}`);
                }
            },
            error => error.status
        );
    }
}

1 个答案:

答案 0 :(得分:1)

使可观察对象与for循环分开。由于可以在事件订阅for循环时可观察地使用来处理异步数据流,因此可能已经执行了。所以为了防止这个创建一个单独的函数并在for循环中调用它

userAudience(name, userIdfaListArray) {
    let id = null,
        deleted = null;
    for (let i = 0; i < userIdfaListArray.length; i++) {
        console.log("index = ", i);
        if (i == 0) {
            id = deleted = 0;
        }
        console.log(`id = ${id}, deleted = ${deleted}`);
        let userIdfaList = userIdfaListArray[i];
        console.log(`userIdfaList:: ${userIdfaList}`);

        this.callAudience(userIdfaLis)

    }

    callAudience(userIdfaLis) {
        this._audienceService.uploadMobileAdIds(id, name, deleted, userIdfaList)
            .subscribe(
                data => {
                    if (data.status === 'success') {
                        id = data.response.id;
                        console.log("id ---> ", id);
                        console.log("response:: ", data.response);
                        this.batchIds.push(data.response.userIdfaList);
                    } else {
                        console.log(`errorcode: ${data.errorcode}`);
                        console.log(`error message: ${data.message}`);
                    }
                },
                error => error.status
            );
    }
}