programing

모든 약속이 해결될 때까지 기다립니다.

powerit 2023. 3. 14. 21:59
반응형

모든 약속이 해결될 때까지 기다립니다.

그래서 알 수 없는 길이의 약속 체인이 여러 개 있습니다.모든 CHENS가 처리되었을 때 실행할 액션을 원합니다.그게 가능하긴 해?다음은 예를 제시하겠습니다.

app.controller('MainCtrl', function($scope, $q, $timeout) {
    var one = $q.defer();
    var two = $q.defer();
    var three = $q.defer();

    var all = $q.all([one.promise, two.promise, three.promise]);
    all.then(allSuccess);

    function success(data) {
        console.log(data);
        return data + "Chained";
    }

    function allSuccess(){
        console.log("ALL PROMISES RESOLVED")
    }

    one.promise.then(success).then(success);
    two.promise.then(success);
    three.promise.then(success).then(success).then(success);

    $timeout(function () {
        one.resolve("one done");
    }, Math.random() * 1000);

    $timeout(function () {
        two.resolve("two done");
    }, Math.random() * 1000);

    $timeout(function () {
        three.resolve("three done");
    }, Math.random() * 1000);
});

이 예에서는, 다음의 설정을 실시합니다.$q.all()약속 1, 2, 3에 대해서는 임의의 시간에 해결됩니다.그리고 나서 1과 3의 끝에 약속을 추가합니다.나는 그 것을 원한다.all모든 사슬이 해결되면 해결할 수 있습니다.이 코드를 실행했을 때의 출력은 다음과 같습니다.

one done 
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained 

체인이 해결될 때까지 기다리는 방법이 있나요?

모든 체인이 해결되면 모든 것이 해결되기를 바랍니다.

네, 그럼 각 체인의 약속을 전달해 주세요all()첫 번째 약속 대신:

$q.all([one.promise, two.promise, three.promise]).then(function() {
    console.log("ALL INITIAL PROMISES RESOLVED");
});

var onechain   = one.promise.then(success).then(success),
    twochain   = two.promise.then(success),
    threechain = three.promise.then(success).then(success).then(success);

$q.all([onechain, twochain, threechain]).then(function() {
    console.log("ALL PROMISES RESOLVED");
});

인정된 답변은 정확합니다.잘 모르시는 분들에게 예를 들어 설명드리겠습니다.promise.

예:

이 예에서는, 의 교환이 필요합니다.src특성img다른 미러 URL이 있는 태그(사용 가능한 경우)를 사용하여 콘텐츠를 렌더링합니다.

var img_tags = content.querySelectorAll('img');

function checkMirrorAvailability(url) {

    // blah blah 

    return promise;
}

function changeSrc(success, y, response) {
    if (success === true) {
        img_tags[y].setAttribute('src', response.mirror_url);
    } 
    else {
        console.log('No mirrors for: ' + img_tags[y].getAttribute('src'));
    }
}

var promise_array = [];

for (var y = 0; y < img_tags.length; y++) {
    var img_src = img_tags[y].getAttribute('src');

    promise_array.push(
        checkMirrorAvailability(img_src)
        .then(

            // a callback function only accept ONE argument. 
            // Here, we use  `.bind` to pass additional arguments to the
            // callback function (changeSrc).

            // successCallback
            changeSrc.bind(null, true, y),
            // errorCallback
            changeSrc.bind(null, false, y)
        )
    );
}

$q.all(promise_array)
.then(
    function() {
        console.log('all promises have returned with either success or failure!');
        render(content);
    }
    // We don't need an errorCallback function here, because above we handled
    // all errors.
);

설명:

각도에서JS 문서:

then방법:

그러면 (success Callback, error Callback, notify Callback): 약속이 해결되거나 거부된 시기와 관계없이 성공 콜백 또는 오류 콜백 중 하나를 결과가 나오는 즉시 비동기적으로 호출합니다.콜백은 결과 또는 거부 이유라는 단일 인수를 사용하여 호출됩니다.

$q.all(표준)

여러 약속을 하나의 약속으로 결합하여 모든 입력 약속이 해결되면 해결됩니다.

promisesparam은 약속 배열일 수 있습니다.

대해서bind()자세한 내용은 이쪽:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

최근 이런 문제가 발생했지만 많은 약속들이 알려지지 않았다.jQuery.map()을 사용하여 해결.

function methodThatChainsPromises(args) {

    //var args = [
    //    'myArg1',
    //    'myArg2',
    //    'myArg3',
    //];

    var deferred = $q.defer();
    var chain = args.map(methodThatTakeArgAndReturnsPromise);

    $q.all(chain)
    .then(function () {
        $log.debug('All promises have been resolved.');
        deferred.resolve();
    })
    .catch(function () {
        $log.debug('One or more promises failed.');
        deferred.reject();
    });

    return deferred.promise;
}

방법이 있다. $q.all(...

아래 내용을 확인하실 수 있습니다.

http://jsfiddle.net/ThomasBurleson/QqKuk/

http://denisonluz.com/blog/index.php/2013/10/06/angularjs-returning-multiple-promises-at-once-with-q-all/

"비동기 함수"에서 "대기"를 사용할 수 있습니다.

app.controller('MainCtrl', async function($scope, $q, $timeout) {
  ...
  var all = await $q.all([one.promise, two.promise, three.promise]); 
  ...
}

메모: 비동기 함수에서 비동기 함수를 호출하여 올바른 결과를 얻을 수 있는지 100% 확신할 수 없습니다.

웹사이트에서는 절대 사용하지 않을 거라고 했어요.하지만 부하 테스트/통합 테스트의 경우... 아마도요.

코드 예:

async function waitForIt(printMe) {
  console.log(printMe);
  console.log("..."+await req());
  console.log("Legendary!")
}

function req() {
  
  var promise = new Promise(resolve => {
    setTimeout(() => {
      resolve("DARY!");
    }, 2000);
    
  });

    return promise;
}

waitForIt("Legen-Wait For It");

언급URL : https://stackoverflow.com/questions/21759361/wait-for-all-promises-to-resolve

반응형