Контекст смешивается в $.deferred.promise

У меня есть следующий код;

function myFunction(promiseObject){
     var that = this;

     promiseObject
        .done(function(){
                 //using that here
              });
}

Вышеуказанная функция вызывается в нескольких контекстах и, следовательно, значение для this изменения в каждом звонке. Проблема, с которой я сталкиваюсь, заключается в том, что для многих одновременных вызовов that переопределяется другим контекстом, который также находится в процессе завершения.

Я хотел понять, что может быть причиной этого. Также хотел понять, что является концепцией за рамки that переменная, определенная в myFunction но используется в прикрепленном методе обратного вызова.

Заранее спасибо:)

-devsri

1 ответ

Решение

Я надеюсь, что я правильно понимаю вашу проблему. Концепция позади that переменная определяется в myFunction и быть доступным в обратном вызове - это лексическая область видимости на работе. Он создает замыкание (в основном, ссылку на среду выполнения функции, в которой определен обратный вызов) для доступа к обратному вызову.

Значение this Внутри myFunction будет зависеть от того, как вы звоните myFunction,

Если вы хотите myFunction чтобы иметь конкретный контекст, вам нужно вызвать его с таким контекстом, например, так:

var myContext = { foo: "bar" };
myFunction.call(myContext);

Значение this внутри myFunction теперь будет равен myContext,

Если вы хотите, чтобы ваша ценность that чтобы оставаться согласованным между вызовами, вам необходимо убедиться, что вы звоните / применяете myFunction с правильным контекстом везде.

В качестве альтернативы вы можете использовать такую ​​функцию, как underscore.js _.bind:

myFunction = _.bind(myFunction, myContext);

myFunction теперь всегда будет привязан к определенному контексту.

Другие вопросы по тегам